在Android app or framework, 如果不想讓系統進入suspend(休眠)狀態的話,
就必須取得wakelock(喚醒鎖), 並且要小心管理wakelock, 一旦沒有釋放wakelock的話
系統就會處在無法suspend的狀態, 大大的增加耗電的速度!
Android SDK官網也有特別強調:
Device battery life will be significantly affected by the use of this API. Do not acquire PowerManager.WakeLocks unless you really need them, use the minimum levels possible, and be sure to release them as soon as possible.
意思就是沒事不要亂取wakelock,
取了也盡量用最小level的wakelock,
並且盡快釋放wakelock.
否則app被user討厭可不要怪我沒警告(這句是我自己加的XD)
從Android SDK官網可以看到wakelock分成四種
要讓app使用wakelock必須在AndroidManifest.xml增加宣告權限
<uses-permission android:name="android.permission.WAKE_LOCK" />
使用方式:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"MyWakelockTag");
wakeLock.acquire();
// do something
wakelock.release();
其中2,3,4在最新的SDK都已經被列為deprecated, 希望開發者改以以下方式來保持螢幕開啟
in Activity:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
or, in layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>
這種方式的好處在於不需要取得特別權限也可以使用,並且當app切換時會由系統來管理該flag的存亡與否.
使用wakelock的時機大多在於需要不被系統突如其來的休眠打斷正在執行的任務,
除非確定系統休眠會造成影響, 否則應該盡量避免使用才是!